Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Μεταξύ δύο μεταβλητών...

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 30-03-2012, 11:30. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  27-03-2012, 19:16 69817

    Μεταξύ δύο μεταβλητών...

    Καλησπέρα για ακόμα μια φορά φόρουμ! έχω μια απορία...

    Θέλουμε να βάλουμε άγνωστο πλήθος τιμών μέσα σε μια μεταβλητή.

    -Είναι γνωστό ότι αυτή η μεταβλητή θα χρησιμοποιηθεί για πράξεις αργότερα-

    Είναι καλύτερα να κάνουμε μια «μεταβλητή()» και να την κάνουμε redim preserve, ή να κάνουμε μια «μεταβλητή List(Of Τ)»?

    (Με εξαίρεση το «κάνε μια μεταβλητή(99999) [με μεγάλο αριθμό], αν υπάρχουν κι άλλοι τρόποι να το κάνω που θα είναι πιο γρήγοροι, πείτε μου)

    btw, κάπου είχα δει και μια μεταβλητή dictionary – ακόμα δεν κατάλαβα τι κάνει, αλλά την αναφέρω σε περίπτωση που μπορεί να έχει application εδώ.


  •  27-03-2012, 22:19 69820 σε απάντηση της 69817

    Απ: Μεταξύ δύο μεταβλητών...

    Καλησπέρα,

    Η αλήθεια είναι πως θέλεις να λύσεις το πρόβλημά σου θα σου υποδείξει τον τρόπο

    • αν θες να το λύσεις "σαν μαθηματικός" θα πας με τον πίνακα, και αν θες να αποφύγεις το σκόπελο του "κάνε μια μεταβλητή(99999)" με ένα έξυπνο τρόπο, για να μην κάνεις ReDim στην προσθήκη κάθε "γραμμής", θα μπορείς να κάνεις μια αρχική τιμή πχ 64, και όταν το γεμίσεις το ReDim που θα ακολουθήσει θα πρέπει να είναι στο 128 (+64)...
    • αν θες να το λύσεις σαν προγραμματιστής θα χρεισιμοποιήσεις την "μεταβλητή List(Of T)" - μπορείς να χρησιμοποιήσεις την LINQ και να βγάλεις πολύ εύκολα αθροίσματα, μέσους όρους, ελάχιστα, μέγιστα με μια γραμμή.

    Το dictionary δεν είναι παρά μια εξέλιξη του hash table, μόνο που είναι strong typed.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  27-03-2012, 23:18 69823 σε απάντηση της 69820

    Απ: Μεταξύ δύο μεταβλητών...

    Ωραία :) Ευχαριστώ πολύ!


    Φοβόμουν μήπως Η "μεταβλητή List(Of T)" είναι πολύ αργή και δεν αξίζει άμα είναι να την καλώ συχνά...

    Αυτό το LINQ το βρίσκω παντού μπροστά μου... πρέπει κάποια στιγμή να βρω χρόνο να το μάθω!


    Ο παρακάτω κώδικας δεν κάνει κάτι, απλώς για να καταλάβετε την ερώτηση που θα ακολουθήσει ρίξτε μια ματιά:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
                Dim lstSomething As New ListBox
                For i = 0 To Something.Length
                    If Something(i) <> String.Empty Then
                        lstSomething.Items.Add(Something)
                    End If
                Next
    
                Dim lstSomethingElse As New ListBox
                For i = 0 To SomethingElse.Length
                    If SomethingElse(i) <> String.Empty Then
                        lstSomethingElse.Items.Add(SomethingElse)
                    End If
                Next
    
                For i = 0 To lstSomething.Items.Count - 2
                    If lstSomething.Items(i).ToString = Whatever Then
                        Dim tmp As String = lstSomething.Items(i).ToString
                        Dim tmp2 As String = lstSomethingElse.Items(i).ToString
    
                        lstSomething.Items(i) = lstSomething.Items(i + 1)
                        lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
    
                        lstSomething.Items(i) = tmp
                        lstSomethingElse.Items(i) = tmp2
                    End If
                Next

    Έχουμε λοιπόν ένα κώδικα ο οποίος βάζει κάτι μέσα σε 2 μεταβλητές Listbox, μετά ψάχνει να βρει κάτι άλλο.. και αν το βρει αλλάζει τα δεδομένα και στα 2 listboxes (θεωρούμε ότι συνδέονται άμεσα τα 2 listboxes και έχουν τον ίδιο αριθμό αντικειμένων)

    Τα listbox είναι (απόσο ξέρω τουλάχιστον) αργές μεταβλητές.. και όταν έχουμε να κάνουμε με χιλιάδες σειρές.. παίρνει κάποια ώρα.

    Αν το ίδιο πράγμα το είχα κάνει με "Μεταβλητή (List of String)" αντί για listbox, θα έβλεπα βελτίωση στην απαιτούμενη ώρα?

    (Η ερώτησή μου έχει άμεση σχέση με το πρώτο ποστ που έκανα - γιατί όταν είπα ότι θα κάνω πράξεις με αυτά, δεν εννοούσα τόσο πραγματικά πράξεις, όσο αυτό το πράγμα.. δηλαδή να διαβάζω τι έχει μέσα σε συγκεκριμένα indexes, και να αλλάζω τις τιμές στα ίδια indexes σε 2 ή περισσότερες μεταβλητές ταυτόχρονα)

    Τώρα πιθανόν να το χρειαστώ και για πράξεις πράξεις, άρα το LINQ σίγουρα θα μου χρησιμεύσει.

    Αυτό που αναρωτιέμαι είναι αν τα έχω σωστά στο μυαλό μου [ listbox < list (of T) < Variable() ], δηλαδή ότι σε θέμα ταχύτητας το listbox είναι αργό, το List (of T) έχει διαφορά, και το variable() είναι πιο γρήγορο αλλά όχι με τεράστια διαφορά απο το list (of T)


  •  28-03-2012, 00:52 69826 σε απάντηση της 69823

    Απ: Μεταξύ δύο μεταβλητών...

    Θεωριτικά η λίστα είναι ένα πλούσιο αντικείμενο, άρα και πιο αργό, αλλά πρακτικά μπορεί να λύσει περισσότερα προβλήματα πιο γρήγορα, πχ:

    Ο αντίστοιχος κώδικας σε Linq θα ήταν κάπως έτσι:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
            Dim lstSomethingSource As List(Of String)
            lstSomethingSource = Something
            lstSomething.DataSource = lstSomethingSource
    
            Dim lstSomethingElseSource As List(Of String)
            lstSomethingElseSource = From s In Something Where s <> String.Empty Select s
            lstSomething.DataSource = lstSomethingSource
    
            Dim i As Integer = 0
            Dim Whatever As String = "Value"
            For Each s As String In lstSomething.Items
                If lstSomething.Items(i).ToString = Whatever Then
                    Dim tmp As String = lstSomething.Items(i).ToString
                    Dim tmp2 As String = lstSomethingElse.Items(i).ToString
    
                    lstSomething.Items(i) = lstSomething.Items(i + 1)
                    lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
    
                    lstSomething.Items(i) = tmp
                    lstSomethingElse.Items(i) = tmp2
    
                End If
    
                i = i + 1
            Next

     

    Επειδή έχουμε Databinding επάνω στο control, σίγουρα θα γεμίσει πιο γρήγορα το control, από τον δικό σου τρόπο - αυτό δεν οφείλεται στη λίστα, αλλά στο τρόπο που γεμίζει.

    Η λίστα για το δεύτερο listbox φιλτράρει με LINQ - κώδικας είναι πολύ πιο καθαρός και εύκολος στην κατανόηση.

    Ωστόσο στην περίπτωση που αλλάζεις τιμές σε ορισμένα items, δεν υπάρχει κάτι καλύτερο να κάνεις - αν όμως υπήρχει τρόπος που με φιλτράρισμα και μεταμόρφωση (trasform) μπορούσε να επιτευχθεί, θα μπορούσε να εκφραστεί σε Linq, άρα θα είχες και την λίστα σου πιο εύκολα, η λίστα με DataBinding θα σου έδεινε και την ταχύτητα θέλεις, κοκ...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  28-03-2012, 18:24 69837 σε απάντηση της 69826

    Απ: Μεταξύ δύο μεταβλητών...

    Αχά, ωραία :)

    Μου γεννήθηκαν όμως μερικές ακόμα ερωτήσεις.... :Ρ


    1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ??

    1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι?

    2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα? 

    3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς:

    1
    2
    3
     
            Dim lstSomethingElseSource As List(Of String)
            lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
            lstSomethingELSE.DataSource = lstSomethingELSESource

    ?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες)

    3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά?

    3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά?

    4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά?

    4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)


    btw, Τα νούμερα στις ερωτήσεις τα βάζω για να ξεχωρίζουν και να φαίνονται πιο καλά, αλλά αν σας την σπάει, μπορώ να το σταματήσω.


  •  29-03-2012, 11:14 69844 σε απάντηση της 69837

    Απ: Μεταξύ δύο μεταβλητών...

    Δεν μπορείς να συγκρίσεις το List<T> με το ListBox.
    To List<Τ> είναι μια δομή θέσεων στη μνήμη για αποθήκευση δεδομένων (συνήθως ίδιου τύπου).
    Το Listbox είναι Control και εκτός από τα δεδομένα του (Items) έχει και visual εμφάνιση (painting, fonts...), δίνει τη δυνατότητα στο χρήστη να κάνει κλικ , να επιλέξει Item. Όλα αυτά έχουν κάποιο κόστος σε μνήμη , resources και χρόνο.
    Για τα δεδομένα του το ListBox μπορεί να χρησιμοποιήσει οποιαδήποτε δομή που κάνει implement το IList.

    Αν ορίσεις DataSource το lstSomethingSource και μετά προσθέσεις κάτι στο lstSomethingSource θα δεις αλλαγή στο ListBox μόνο αν το lstSomethingSource υποστηρίζει notifications. Διαφορετικά θα πρέπει να ανανεώσεις το binding.
  •  29-03-2012, 12:27 69845 σε απάντηση της 69844

    Απ: Μεταξύ δύο μεταβλητών...

    Αχά, άρα με λίγα δεν είναι αλληλένδετα εκτός κιαν ορίσεις "notification".

    Αν έχεις χρόνο απάντησε και σε μερικές ακόμα απο ερωτήσεις μου (προηγούμενο ποστ) :)


  •  29-03-2012, 13:35 69846 σε απάντηση της 69845

    Απ: Μεταξύ δύο μεταβλητών...

    Με LINQ δεν έχω ασχοληθεί, οπότε μπορεί να τα πω λάθος.

    Όσο για τα notifications, υποστηρίζει το BindingList<T> . 
                BindingList<string> list = new  BindingList<string>();
                list.Add("1");
                list.Add("2");
                listBox1.DataSource = list;
                list.Add("3");
                list.Add("4");
    Στο listBox1 θα εμφανιστούν και τα 3, 4 που προστέθηκαν μετά το Binding.
    Αν είχες List θα εμφάνιζε μόνο τα 1, 2.
  •  29-03-2012, 13:45 69847 σε απάντηση της 69846

    Απ: Μεταξύ δύο μεταβλητών...

    Άα άρα μιλάμε για άλλη εντελώς μεταβλητή. Ωραία, good to know.

    Ευχαριστώ φίλε μου :)


    Btw, για όσους διαβάσουν αυτό το μήνυμα, να ξέρετε ότι υπάρχουν κι άλλες άλυτες ερωτήσεις μου πιο πάνω. Και για να μην ψάχνετε να τις βρίσκεται, τις ξαναγράφω εδώ:

    1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ??

    1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι?

    2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα?

    3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς:

       

    1
    2
    3
     
    Dim lstSomethingElseSource As List(Of String)
    lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
    lstSomethingELSE.DataSource = lstSomethingELSESource

    ?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες)

    3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά?

    3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά?

    4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά?

    4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)


  •  30-03-2012, 11:04 69855 σε απάντηση της 69837

    Απ: Μεταξύ δύο μεταβλητών...

    AlKiS:

    1) το "lstSomething" στο "lstSomething.DataSource = lstSomethingSource" είναι τύπου ListBox ??

    1.1) Αν ναι, τότε γιατί χρησιμοποιούμαι και το List (of T) και το listbox?? Κερδίζουμε κάτι?

    2) Από τα λεγόμενά σου είναι ξεκάθαρο ότι μια String() μεταβλητή είναι πιο γρήγορη και από listbox και από List (of T). Όμως δεν είναι ξεκάθαρο ακόμα αν μια List (of T) είναι πιο γρήγορα από μια listbox. Είναι πιο γρήγορα? 

    3) Στον κώδικα αυτό, μήπως στις γραμμές 5 ως και 7 εννοείς:

    1
    2
    3
     
            Dim lstSomethingElseSource As List(Of String)
            lstSomethingElseSource = From s In SomethingELSE Where s <> String.Empty Select s
            lstSomethingELSE.DataSource = lstSomethingELSESource

    ?? (Ρωτάω για να σιγουρευτώ ότι κατάλαβα τι γίνεται, και να μην λέω βλακείες)

    3.1) Αν ναι, τότε νομίζω καταλαβαίνω τι κάνει ο κώδικάς σου, και παρατηρώ το εξής: Στην γραμμή 2, δίνεις κατευθείαν όλο το array στην λίστα, ενώ στην γραμμή 6 μέσω LINQ του λες να πάρει μόνο αυτά που δεν είναι άδεια (""). Σωστά?

    3.2) Πάλι αν ναι, τότε και στην γραμμή 2 θα πρέπει να το κάνουμε με LINQ να παίρνει μόνο τις μη-καινές τιμές με τον ίδιο ακριβώς τρόπο, σωστά?

    4) Το Databinding που αναφέρεις είναι αυτό: "lstSomething.DataSource = lstSomethingSource". Δηλαδή όταν δίνουμε κάτι σε ένα DataSource ονομάζεται Databinding, σωστά?

    4.1) Αφού δώσαμε σαν DataSource το lstSomethingSource, τώρα ότι αλλαγή κάνουμε στο "lstSomething" θα αλλάζει επίσης και το "lstSomethingSource"?? (με άλλα λόγια, δεν δημιουργήσαμε καινούργιο array, απλώς δώσαμε ένα reference στο "lstSomethingSource" ε?)

    Αρχίζοντας με την πλήρη κώδικα που είχα μπροστά μου στο παράδειγμα που είχα φτιάξει προχτές - τα lstSomething και lstSomethingElse είναι listbox controls

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
            Dim Something As List(Of String)
    
            Something = New List(Of String)
            Something.Add("Value 1")
            Something.Add("Value 2")
            Something.Add(String.Empty)
            Something.Add("Value 3")
            Something.Add("Value 4")
            Something.Add(String.Empty)
            Something.Add("Value 5")
    
            Dim lstSomethingSource As List(Of String)
            lstSomethingSource = Something
            lstSomething.DataSource = lstSomethingSource
    
            Dim lstSomethingElseSource As List(Of String)
            lstSomethingElseSource = (From s In Something Where s <> String.Empty Select s).ToList()
            lstSomethingElse.DataSource = lstSomethingElseSource
    
            Dim i As Integer = 0
            Dim Whatever As String = "Value"
            For Each s As String In lstSomething.Items
                If lstSomething.Items(i).ToString = Whatever Then
                    Dim tmp As String = lstSomething.Items(i).ToString
                    Dim tmp2 As String = lstSomethingElse.Items(i).ToString
    
                    lstSomething.Items(i) = lstSomething.Items(i + 1)
                    lstSomethingElse.Items(i) = lstSomethingElse.Items(i + 1)
    
                    lstSomething.Items(i) = tmp
                    lstSomethingElse.Items(i) = tmp2
    
                End If
    
                i = i + 1
            Next

     

    1.1 Για να μπορέσουμε να κάνουμε το DataBinding, πρέπει να έχουμε ένα αντικείμενο που ικανοποιεί το interface IEnumerable το λιγότερο - αν δεν κάνω λάθος. Το List (Of T) είναι ο συνηθησμένος τρόπος να καλύψεις αυτή την ανάγκη μιας και μπορείς να το χρησιμοποιήσεις και με την LINQ.

    2. Η μεταβλητή String() είναι πιο γρήγορη από το List(Of String). Αυτό έχει να κάνει με την χρήση αποκλειστικά της μεταβλητής στο πρόγραμμα. Όμως το DataBinding επιτρέπει να φορτώσεις τα δεδομένα στο control πιο γρήγορα - αρκεί η μεταβλητή που θα δώσεις ικανοποιεί αυτά που είπαμε προγουμένως - το List(Of T) μπορεί να γίνει databind, το String() όχι. Υπόψη εδώ ότι όπου υπάρχουν generics, μπαίνουν στην μέση και τα optimizations που κάνει ο compliler που εξαρτούνται από το hardware του μηχανίματος, και δεν μπορείς να έχεις σαφή εικόνα πόσο πιο αργός ή γρήγορος θα είναι ο κώδιακας τελικά...

    3. Όχι, έχω παρει τα αρχικά δεδομένα (Something) και σε αυτά ψάχνω τις τιμές - αν ήθελα να χρησιμοποιήσω τα δεδομένα που είχε το πρώτο listbox control, δεν θα έπαιρνα την συλλογή Items που έχει το listbox. Θα προτειμούσα το List(Of T) από το οποίο έχουν προκύψει. Κάθε αλλαγή στο .Items του listbox προκαλεί διάφορα events, όπως redraw στην φόρμα που κοστίζουν πολύ σε χρόνο.

    3.1. Σωστά προσπαθώ να πάρω τις μη κενές τιμές.

    4. Ναι

    4.1. Όχι - κάθε καινούργια λίστα έχει αντίγραφα των αντικειμένων που πήρε από την λίστα από την οποία προήλθε, όχι τα ίδια.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  30-03-2012, 11:30 69858 σε απάντηση της 69855

    Απ: Μεταξύ δύο μεταβλητών...

    Thank you, this was of great help!!! :)


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems